const shoppingCartModule = {
  state: {
    cart: JSON.parse(localStorage.getItem('cart')) || [], // 购物车数组
  },
  getters: { // 相当于是 store 中的计算属性
    /**
     * 计算是否全选
     * @param {*} state
     * @returns
     */
    allChecked(state) {
      return state.cart.every(prod => prod.checked)
    },
    /**
     * 计算选中商品的合计金额
     * @param {*} state
     */
    totalMoney(state) {
      return state.cart.reduce((result, prod) => {
        if (prod.checked) {
          result += prod.price * prod.amount * 100
        }
        return result
      }, 0)
    },
    /**
     * 计算购物车中商品的总数量
     * @param {*} state
     * @returns
     */
    totalAmount(state) {
      return state.cart.reduce((result, prod) => result + prod.amount, 0)
    },
  },
  mutations: { // 同步更新状态数据
    /**
     * 加入购物车
     * @param state 状态
     * @param payload 有效载荷
     */
    addToCart(state, payload) {
      /* 如果购物车中已存在当前选购的商品，则叠加修改数量即可 */
      const has = state.cart.some(prod => prod.id === payload.id)
      if (has) { // 有
        state.cart = state.cart.map(prod => {
          const copy = { ...prod }
          if (copy.id === payload.id) {
            copy.amount += payload.amount // 叠加数量
          }
          return copy
        })
      } else { // 没有
        state.cart.push({
          ...payload,
          checked: true, // 是否选中，默认选中
        })
      }
    },
    /**
     * 从购物车中删除选购的商品
     * @param {*} state
     * @param {*} payload
     */
    removeFromCart(state, payload) {
      state.cart = state.cart.filter(prod => prod.id !== payload.id)
    },
    /**
     * 修改购物车中指定商品的数量
     * @param {*} state
     * @param {*} payload {id, amount}
     */
    modifyAmount(state, payload) {
      state.cart = state.cart.map(prod => {
        const copy = { ...prod }
        if (copy.id === payload.id) {
          copy.amount = payload.amount
        }
        return copy
      })
    },
    /**
     * 修改商品的选中状态
     * @param {*} state
     * @param {*} payload {id}
     */
    modifyChecked(state, payload) {
      state.cart = state.cart.map(prod => {
        const copy = { ...prod }
        if (copy.id === payload.id) {
          copy.checked = !copy.checked
        }
        return copy
      })
    },
    /**
     * 修改全选状态（全选、取消全选）
     * @param {*} state
     * @param {*} payload { checked }
     */
    modifyAllChecked(state, payload) {
      state.cart = state.cart.map(prod => {
        const copy = { ...prod }
        copy.checked = payload.checked
        return copy
      })
    },
  },
}

export default shoppingCartModule
